{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "13e45cc7-101b-4d89-b3a3-c993fc8dd84f",
   "metadata": {},
   "source": [
    "# PyTorch Regression Example"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "900cec25-4212-40a2-909e-2f79faffe7e8",
   "metadata": {},
   "source": [
    "## Dataset"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "08ec38ee-d521-4297-ae66-3266975d5ebd",
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "\n",
    "X_train = np.array(\n",
    "    [258.0, 270.0, 294.0, 320.0, 342.0, 368.0, 396.0, 446.0, 480.0, 586.0]\n",
    ")[:, np.newaxis]\n",
    "\n",
    "y_train = np.array(\n",
    "    [236.4, 234.4, 252.8, 298.6, 314.2, 342.2, 360.8, 368.0, 391.2, 390.8]\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "594434e0-5c82-46f5-8c08-8be56cdd5cb5",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "\n",
    "plt.scatter(X_train, y_train)\n",
    "plt.xlabel(\"Feature variable\")\n",
    "plt.ylabel(\"Target variable\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "82ec75e6-09fe-4d0a-beeb-983b7b45a024",
   "metadata": {},
   "source": [
    "## Linear Regression"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "9fffa3a6-de00-4534-bd2b-af614c9477b1",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Users/sebastianraschka/miniforge3/lib/python3.9/site-packages/scipy/__init__.py:146: UserWarning: A NumPy version >=1.16.5 and <1.23.0 is required for this version of SciPy (detected version 1.23.1\n",
      "  warnings.warn(f\"A NumPy version >={np_minversion} and <{np_maxversion}\"\n"
     ]
    }
   ],
   "source": [
    "from sklearn.linear_model import LinearRegression\n",
    "\n",
    "lr = LinearRegression()\n",
    "lr.fit(X_train, y_train)\n",
    "\n",
    "# create predictions for plotting\n",
    "X_train_range = np.arange(250, 600, 10)[:, np.newaxis]\n",
    "y_linear = lr.predict(X_train_range)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "a3296337-3950-48f7-aa7f-26096199e7ae",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# plot results\n",
    "plt.scatter(X_train, y_train, label=\"Training points\")\n",
    "plt.plot(X_train_range, y_linear, label=\"Linear fit\", linestyle=\"--\")\n",
    "\n",
    "plt.scatter(X_train, y_train)\n",
    "plt.xlabel(\"Feature variable\")\n",
    "plt.ylabel(\"Target variable\")\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "55dc5260-e47c-4997-ae02-d84e4ad65aed",
   "metadata": {},
   "source": [
    "## Polynomial Regression"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "fffa7dd6-129a-4a95-ab44-dfa7bf2be1e4",
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.preprocessing import PolynomialFeatures\n",
    "\n",
    "pr = LinearRegression()\n",
    "\n",
    "quadratic = PolynomialFeatures(degree=2)\n",
    "quadratic.fit(X_train)\n",
    "X_train_quad = quadratic.transform(X_train)\n",
    "\n",
    "pr.fit(X_train_quad, y_train);"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "ceec6ae9-4230-4ff5-bbdd-81c0e1ca2df5",
   "metadata": {},
   "outputs": [],
   "source": [
    "y_quadratic = pr.predict(quadratic.transform(X_train_range))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "1a7e55b6-c288-4ad9-aea0-3d135bd985d1",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# plot results\n",
    "plt.scatter(X_train, y_train, label=\"Training points\")\n",
    "plt.plot(X_train_range, y_linear, label=\"Linear fit\", linestyle=\"--\")\n",
    "plt.plot(X_train_range, y_quadratic, label=\"Quadratic fit\")\n",
    "\n",
    "plt.scatter(X_train, y_train)\n",
    "plt.xlabel(\"Feature variable\")\n",
    "plt.ylabel(\"Target variable\")\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "96a629eb-791b-4e2b-81d0-eae0eb791237",
   "metadata": {},
   "source": [
    "## Multilayer Perceptron"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "04c99427-456f-44a7-92fb-f92c5fa5a4c3",
   "metadata": {},
   "source": [
    "### Define model"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "0cdea572-f193-4efb-a0a2-d6c8b70b3c46",
   "metadata": {},
   "outputs": [],
   "source": [
    "import torch\n",
    "\n",
    "\n",
    "class PyTorchMLP(torch.nn.Module):\n",
    "    def __init__(self, num_features):\n",
    "        super().__init__()\n",
    "\n",
    "        self.all_layers = torch.nn.Sequential(\n",
    "            # 1st hidden layer\n",
    "            torch.nn.Linear(num_features, 50),\n",
    "            torch.nn.ReLU(),\n",
    "            # 2nd hidden layer\n",
    "            torch.nn.Linear(50, 25),\n",
    "            torch.nn.ReLU(),\n",
    "            # output layer\n",
    "            torch.nn.Linear(25, 1),\n",
    "        )\n",
    "\n",
    "    def forward(self, x):\n",
    "        logits = self.all_layers(x).flatten()\n",
    "        return logits"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "cbe9c230-0543-47c9-9628-df19874b9f64",
   "metadata": {},
   "source": [
    "#### Normalize data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "2122eadb-adf5-4775-b7fc-fb6a8f6c12fc",
   "metadata": {},
   "outputs": [],
   "source": [
    "x_mean, x_std = X_train.mean(), X_train.std()\n",
    "y_mean, y_std = y_train.mean(), y_train.std()\n",
    "\n",
    "X_train_norm = (X_train - x_mean) / x_std\n",
    "y_train_norm = (y_train - y_mean) / y_std"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "fe081dcb-2110-44d1-8d64-5a475376b97f",
   "metadata": {},
   "source": [
    "### Set up dataloader"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "33d051fb-baca-4c71-8721-ee0b0b788d98",
   "metadata": {},
   "outputs": [],
   "source": [
    "from torch.utils.data import DataLoader, Dataset\n",
    "\n",
    "\n",
    "class MyDataset(Dataset):\n",
    "    def __init__(self, X, y):\n",
    "\n",
    "        self.features = torch.tensor(X, dtype=torch.float32)\n",
    "        self.targets = torch.tensor(y, dtype=torch.float32)\n",
    "\n",
    "    def __getitem__(self, index):\n",
    "        x = self.features[index]\n",
    "        y = self.targets[index]\n",
    "        return x, y\n",
    "\n",
    "    def __len__(self):\n",
    "        return self.targets.shape[0]\n",
    "\n",
    "\n",
    "train_ds = MyDataset(X_train_norm, y_train_norm)\n",
    "\n",
    "train_loader = DataLoader(\n",
    "    dataset=train_ds,\n",
    "    batch_size=20,\n",
    "    shuffle=True,\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6408fabf-95d6-4014-80fe-70720abac3c9",
   "metadata": {},
   "source": [
    "### Train model"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "d0dc495a-5408-48ca-b129-0d5117d1cf0a",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch: 001/050 | Batch 000/001 | Train Loss: 0.95\n",
      "Epoch: 002/050 | Batch 000/001 | Train Loss: 0.68\n",
      "Epoch: 003/050 | Batch 000/001 | Train Loss: 0.47\n",
      "Epoch: 004/050 | Batch 000/001 | Train Loss: 0.29\n",
      "Epoch: 005/050 | Batch 000/001 | Train Loss: 0.17\n",
      "Epoch: 006/050 | Batch 000/001 | Train Loss: 0.11\n",
      "Epoch: 007/050 | Batch 000/001 | Train Loss: 0.09\n",
      "Epoch: 008/050 | Batch 000/001 | Train Loss: 0.07\n",
      "Epoch: 009/050 | Batch 000/001 | Train Loss: 0.06\n",
      "Epoch: 010/050 | Batch 000/001 | Train Loss: 0.06\n",
      "Epoch: 011/050 | Batch 000/001 | Train Loss: 0.05\n",
      "Epoch: 012/050 | Batch 000/001 | Train Loss: 0.04\n",
      "Epoch: 013/050 | Batch 000/001 | Train Loss: 0.04\n",
      "Epoch: 014/050 | Batch 000/001 | Train Loss: 0.04\n",
      "Epoch: 015/050 | Batch 000/001 | Train Loss: 0.03\n",
      "Epoch: 016/050 | Batch 000/001 | Train Loss: 0.03\n",
      "Epoch: 017/050 | Batch 000/001 | Train Loss: 0.03\n",
      "Epoch: 018/050 | Batch 000/001 | Train Loss: 0.02\n",
      "Epoch: 019/050 | Batch 000/001 | Train Loss: 0.02\n",
      "Epoch: 020/050 | Batch 000/001 | Train Loss: 0.02\n",
      "Epoch: 021/050 | Batch 000/001 | Train Loss: 0.02\n",
      "Epoch: 022/050 | Batch 000/001 | Train Loss: 0.02\n",
      "Epoch: 023/050 | Batch 000/001 | Train Loss: 0.02\n",
      "Epoch: 024/050 | Batch 000/001 | Train Loss: 0.02\n",
      "Epoch: 025/050 | Batch 000/001 | Train Loss: 0.02\n",
      "Epoch: 026/050 | Batch 000/001 | Train Loss: 0.02\n",
      "Epoch: 027/050 | Batch 000/001 | Train Loss: 0.01\n",
      "Epoch: 028/050 | Batch 000/001 | Train Loss: 0.01\n",
      "Epoch: 029/050 | Batch 000/001 | Train Loss: 0.01\n",
      "Epoch: 030/050 | Batch 000/001 | Train Loss: 0.01\n",
      "Epoch: 031/050 | Batch 000/001 | Train Loss: 0.01\n",
      "Epoch: 032/050 | Batch 000/001 | Train Loss: 0.01\n",
      "Epoch: 033/050 | Batch 000/001 | Train Loss: 0.01\n",
      "Epoch: 034/050 | Batch 000/001 | Train Loss: 0.01\n",
      "Epoch: 035/050 | Batch 000/001 | Train Loss: 0.01\n",
      "Epoch: 036/050 | Batch 000/001 | Train Loss: 0.01\n",
      "Epoch: 037/050 | Batch 000/001 | Train Loss: 0.01\n",
      "Epoch: 038/050 | Batch 000/001 | Train Loss: 0.01\n",
      "Epoch: 039/050 | Batch 000/001 | Train Loss: 0.01\n",
      "Epoch: 040/050 | Batch 000/001 | Train Loss: 0.01\n",
      "Epoch: 041/050 | Batch 000/001 | Train Loss: 0.01\n",
      "Epoch: 042/050 | Batch 000/001 | Train Loss: 0.01\n",
      "Epoch: 043/050 | Batch 000/001 | Train Loss: 0.01\n",
      "Epoch: 044/050 | Batch 000/001 | Train Loss: 0.01\n",
      "Epoch: 045/050 | Batch 000/001 | Train Loss: 0.01\n",
      "Epoch: 046/050 | Batch 000/001 | Train Loss: 0.01\n",
      "Epoch: 047/050 | Batch 000/001 | Train Loss: 0.01\n",
      "Epoch: 048/050 | Batch 000/001 | Train Loss: 0.01\n",
      "Epoch: 049/050 | Batch 000/001 | Train Loss: 0.01\n",
      "Epoch: 050/050 | Batch 000/001 | Train Loss: 0.01\n"
     ]
    }
   ],
   "source": [
    "import torch.nn.functional as F\n",
    "\n",
    "torch.manual_seed(1)\n",
    "model = PyTorchMLP(num_features=1)\n",
    "\n",
    "optimizer = torch.optim.SGD(model.parameters(), lr=0.1)\n",
    "\n",
    "num_epochs = 50\n",
    "\n",
    "loss_list = []\n",
    "train_acc_list, val_acc_list = [], []\n",
    "for epoch in range(num_epochs):\n",
    "\n",
    "    model = model.train()\n",
    "    for batch_idx, (features, targets) in enumerate(train_loader):\n",
    "\n",
    "        logits = model(features)\n",
    "        loss = F.mse_loss(logits, targets)\n",
    "\n",
    "        optimizer.zero_grad()\n",
    "        loss.backward()\n",
    "        optimizer.step()\n",
    "\n",
    "        if not batch_idx % 250:\n",
    "            ### LOGGING\n",
    "            print(\n",
    "                f\"Epoch: {epoch+1:03d}/{num_epochs:03d}\"\n",
    "                f\" | Batch {batch_idx:03d}/{len(train_loader):03d}\"\n",
    "                f\" | Train Loss: {loss:.2f}\"\n",
    "            )\n",
    "        loss_list.append(loss.item())"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "fa060e92-7289-46af-bfa7-34840147dfb4",
   "metadata": {},
   "source": [
    "### Normalize \"new\" data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "a159680e-1a96-4c90-899c-0c616bc72575",
   "metadata": {},
   "outputs": [],
   "source": [
    "X_trainrange_norm = (X_train_range - x_mean) / x_std\n",
    "X_trainrange_norm = torch.tensor(X_trainrange_norm, dtype=torch.float32)\n",
    "\n",
    "model.eval()\n",
    "\n",
    "# predict\n",
    "y_mlp_norm = model(X_trainrange_norm)\n",
    "y_mlp_norm = y_mlp_norm.detach().numpy().astype(np.float64)\n",
    "\n",
    "# MLP returns normalized predictions\n",
    "# undo normalization of preditions for plotting\n",
    "y_mlp = y_mlp_norm * y_std + y_mean"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "85b128ef-c1de-417b-a534-0fb227bf3837",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# plot results\n",
    "plt.scatter(X_train, y_train, label=\"Training points\")\n",
    "plt.plot(X_train_range, y_linear, label=\"Linear regression\", linestyle=\"--\")\n",
    "plt.plot(\n",
    "    X_train_range, y_quadratic, label=\"Polynomial (quadratic) regression\", linestyle=\":\"\n",
    ")\n",
    "plt.plot(X_train_range, y_mlp, label=\"Multilayer perceptron\")\n",
    "\n",
    "plt.xlabel(\"Feature variable\")\n",
    "plt.ylabel(\"Target variable\")\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "54983034-5c8d-43a4-ac3f-2a7dc558184d",
   "metadata": {},
   "source": [
    "## Extrapolating outside the training set range"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "829e00be-2651-4f75-a6af-b7679103a8fb",
   "metadata": {},
   "outputs": [],
   "source": [
    "# create predictions for plotting\n",
    "X_outrange = np.arange(-1000, 2000, 10)[:, np.newaxis]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "b29f298b-f497-40fd-bd09-2ce079a88e54",
   "metadata": {},
   "outputs": [],
   "source": [
    "# linear regression\n",
    "y_linear = lr.predict(X_outrange)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "4c181556-9719-45a5-b521-d565532e6163",
   "metadata": {},
   "outputs": [],
   "source": [
    "# quadratic regression\n",
    "y_quadratic = pr.predict(quadratic.transform(X_outrange))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "f6f750af-549f-4168-be00-5613578e9d92",
   "metadata": {},
   "outputs": [],
   "source": [
    "# mlp\n",
    "X_outrange_norm = (X_outrange - x_mean) / x_std\n",
    "X_outrange_norm = torch.tensor(X_outrange_norm, dtype=torch.float32)\n",
    "\n",
    "# predict\n",
    "y_mlp_norm = model(X_outrange_norm)\n",
    "y_mlp_norm = y_mlp_norm.detach().numpy().astype(np.float64)\n",
    "\n",
    "# MLP returns normalized predictions\n",
    "# undo normalization of preditions for plotting\n",
    "y_mlp = y_mlp_norm * y_std + y_mean"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "3d66dd3e-8aa1-47de-8bca-085b6a73e25c",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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5cuXk5mZyfvvv8+gQYOwWq3MmDGDFStWUFhYyF133cVtt91Gbm4u48eP59SpUxQXF/Pcc88xfvx40tPTGT16NMOGDWPNmjUsXryYtm3PZG2NiYlh2rRpLF26lLvvvpvw8HBmzpxJYWEh7du3Z968eYSEhPD999/z4IMPEhkZSa9evfjrr7/49ttvmTVrFocOHSI9PZ3IyEhee+01br/9dvbt2wcYC2kNGDCAn3/+mfvuuw8wcoGtXLmS3NxcJk+eTHZ2NhaLhXfeeYdBgwaVWitl9uzZzJ1rrNh3yy23cP/99zuuaeDAgfz666+0atWKr7/+msBA1+dX0+qAxtEgXkYrxaT1UnSFUtuUMuaahLU2O5I6w2KxsG7dOr7//nuefvppkpOTef/992ncuDG///47hYWFDBgwgBEjRtC6dWsWLVpEo0aNOHHiBP369WPcuHEApKWlMW/ePN5+++1yzxMQEMCqVas4ceIEEydOJDk5meDgYF544QVmz57NI488Ummq+/Xr17Nq1SoCAwO55ppreOCBBxg4cCD79u1j5MiRbN++nZdffpm33nqLAQMGkJubS0BAAHPmzGHkyJE88cQTWK3Ws1ZwXL9+fbkp8ps0acLOnTv57LPPeO+997jqqqtYuHAh1113nXt+EJpn63+X2RHoCqXWLXsOMvfB5e+auupaeSprUQT6eVe6PTzY77xbJFWZOHEiAL1793YkcVy6dCmbNm3iq6++Aowkkjt37iQ6OprHH3+clStX4uXlxcGDBzl69CgAbdu2pV+/fhWeZ/LkyQCsXbuWbdu2MWDAAACKioro378/qamplaa6HzdunKN1kJyczLZtZ7JGZ2dnk5OTw4ABA3jwwQe59tprmThxItHR0fTp04dp06ZRXFzMhAkTSExMLBXXqlWryk2RP27cOGJjYx37O39/tAbs8CZjblvT2p+AqSuU2ubjb6x34mGViScrSf3unPZdKcUbb7zByJEjS+07f/58jh8/zvr16/H19SUmJsaR8t45LX55SrYrpRg+fDifffZZqe0bNmyo1vEANpuNNWvWnHX7acaMGYwZM4bvv/+efv36kZyczODBg1m5ciXfffcd119/PQ8//DA33HCD45jKslmUTYufn+/69Wm0OsRSBB9PNLKWT/641k9v6igvEXlIRJSIRDqVPSYiu0QkTURGOpX3FpHN9m2vi31xChHxF5EF9vLfRCTGhEupviGPwLg3zI6izhs5ciTvvPOOY8GtHTt2cPr0abKysmjatCm+vr4sX76cvXv3nvN79+vXj9WrV7Nr1y4A8vLy2LFjxzmluh8xYkSpRJIbN24EYPfu3XTr1o1HH32UpKQkUlNT2bt3L02bNuXWW2/l5ptvPittfU1T5GsNiI+fUZGMMyeJqWktFBFpDQwH9jmVdQauBroALYFkEYlTSlmBd4DpwFrge2AU8ANwM3BKKdVBRK4GXgAm1+a1VMvpk5CZbqSo1xzy8vJKraz44IMPVuu4W265hfT0dHr16oVSiqioKBYvXsy1117LZZddRlJSEomJiSQknHuK76ioKObPn8+UKVMoLCwE4LnnniMuLq7aqe5ff/117rrrLrp3747FYmHw4MG8++67vPrqqyxfvhxvb286d+7M6NGj+fzzz3nppZfw9fUlJCTkrCHTvXr1KjdFvr69pZWrTcW3dd2uZAhlbT+Ar4AeQDoQaS97DHjMaZ8fgf5ACyDVqXwK8C/nfezPfYAT2JNeVvbo3bu3qlXJzyg1K0ypzAO1e95KbNu2zewQ6pycnByllFI2m03dcccdavbs2SZHpNWmOvM3k7lfqfljldqzyuVvDaSoCj5XTbnlJSLjgINKqT/LbGoFOM/2O2Ava2V/Xra81DFKKQuQBURUcN7pIpIiIinHjx+v8XWck4H3w1UfQWP3LkiluZdOda/VCYHhkHcK8k7W6mnddstLRJKB5uVsegJ4HBhR3mHllKlKyis75uxCpeYAc8BIX1/ePm7jHwqdxtbqKTXXe+CBB85afEvTPI5fENz+S60uhwFu7JRXSl2ilOpa9gH8BcQCf4pIOhAN/CEizTFaHs4TNKKBQ/by6HLKcT5GRHyAxkCGu67rnOUegw8nwJEtZkeiaVpDImLMe9t/9oRkd6n1W15Kqc1KqaZKqRilVAxGhdBLKXUEWAJcbR+5FQt0BNYppQ4DOSLSzz666wbga/tbLgGm2p9PApbZ7/N5hoy/4ORu8AkwOxJN0xqajZ/A+8PhQO0sJuhR81CUUltF5AtgG2AB7lLGCC+AO4D5QCDG6K4f7OXvAx+JyC6MlsnVtRp0Vdr0g/s26nknmqbVvs4TAIEWPWrldKZXKPZWivPrvwF/K2e/FKBrOeUFwJXuiq9GTu6GJrG6MtE0zRz+IUZq+1qi09e7S0E2vHcR/Pi42ZF4NG9vbxITE+natStXXnnlWXmsnM2fP5+77767FqM746mnniI5ObnSfW688UZHKpiy7r//flauXOmO0BzO5/uzcePGUlmNlyxZwvPPP1/h/kVFRQwePNiRscDTHTp0iEmTJpkdhvm2LYGl/+f20+gKxV18g2D0i5B4jdmReLTAwEA2btzIli1b8PPz49133zU7pHI988wzXHLJJed1bEZGBmvXrmXw4MEujqp6KvvwL1uhjBs3jhkzZlS4v5+fHxdffHGlWQLAmN9ms9Usm7YrKq2WLVtWWMk3KEe3wO7lUFTxP2yuoCsUd/H2gR6ToUV3syOpvnljzqxvby02Xv9p/+AoyjNeb1lovC7IMl5vW2K8Pn3SeJ1m79rKOXrOpx80aBC7du0iIyODCRMm0L17d/r168emTZtK7ZeTk0NsbKwj7Up2djYxMTEUFxczdOhQHn30Ufr27UtcXBy//PKLEW5BATfddBPdunWjZ8+eLF++HDD+q58wYQKXXXYZsbGxvPnmm8yePZuePXvSr18/MjKMAYPOrY9nnnmGPn360LVrV6ZPn15pri2Ar776ilGjRjle//e//yUhIYGBAwdy7733MnasMZx81qxZvPzyy479unbt6pgNP2HCBHr37k2XLl1KJaScN28ecXFxDBkyhNWrVzvKb7zxRh588EGGDRvGo48+yrp167jwwgvp2bMnF154IWlpaRQVFfHUU0+xYMECEhMTWbBgQalWztGjR7n88svp0aMHPXr04Ndff3XE8sknn5x1nenp6XTq1Ik777yTXr16sX//fl566SX69OlD9+7dmTlzpmPfZ599loSEBIYPH86UKVMc1z106FAef/xxhgwZwmuvvcb69esZMmQIvXv3ZuTIkRw+fBgwMhF07tyZ7t27c/XVRrfpzz//TGJiIomJifTs2ZOcnBzS09Pp2rVrlb8DEydOZNSoUXTs2JFHHnmk0p9nnTTo/8FtvxjDid3I9D6UemnzV8YiWonX1Po48LrKYrHwww8/MGrUKGbOnEnPnj1ZvHgxy5Yt44YbbnDkwgIIDQ1l6NChfPfdd0yYMIHPP/+cK664Al9fX8d7lU13/9ZbbwGwefNmUlNTGTFiBDt27ABgy5YtbNiwgYKCAjp06MALL7zAhg0beOCBB/jwww+5//77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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# plot results\n",
    "plt.scatter(X_train, y_train, label=\"Training points\")\n",
    "plt.plot(X_outrange, y_linear, label=\"Linear regression\", linestyle=\"--\")\n",
    "plt.plot(\n",
    "    X_outrange, y_quadratic, label=\"Polynomial (quadratic) regression\", linestyle=\":\"\n",
    ")\n",
    "plt.plot(X_outrange, y_mlp, label=\"Multilayer perceptron\")\n",
    "\n",
    "plt.xlabel(\"Feature variable\")\n",
    "plt.ylabel(\"Target variable\")\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "adcfda06-22ed-43dc-be5f-2a18c1bdce2e",
   "metadata": {},
   "source": [
    "---"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "19def823-9e4a-49a2-9ec1-3a45a4fd555e",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "torch     : 1.12.1\n",
      "matplotlib: 3.5.2\n",
      "numpy     : 1.22.1\n",
      "\n"
     ]
    }
   ],
   "source": [
    "%load_ext watermark\n",
    "%watermark -iv"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
